{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([[5,1],[4,2],[2,5],[1,4],[3,2],[2,5]])#TODO\n",
    "y = np.array([0,0,1,1,0,1])#TODO  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X,y)# TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)\n",
    "pt_class=prediction[0]\n",
    "pt_class#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAHJCAYAAACL5E3/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABiB0lEQVR4nO3deVxUZf//8dewo4A74oJYbrgruaF1qxmud0qL+UVLzaVNSzP11m5zrayszO66zdSkuiXLSivTDC3cKzfKLVNTcUG9NQURxRHO74/5MbfIgAzMMDC+n4/HPHLOuc51Pp85M/nxOtc5x2QYhoGIiIjILc7D1QGIiIiIlAQqikRERERQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokiEI0eOYDKZMJlM+bYbPHgwJpOJqVOnFk9gDpAds8lk4vHHH8+zXUZGBhUrVrS2TUhIKL4g/7/sWJ2574SEBGuO2S8vLy9CQkLo06cPP/74o9P2fb3MzEwmT55MnTp18PHxwWQyMXjw4GLZt4jkzcvVAYhI8Vi6dCn/+te/8PHxybXu22+/5fz58y6IyjWqVq1K9+7dAbhy5QqJiYl8/fXXfPPNN7z77rs8+eSTTt3/nDlzmDFjBtWrV+f+++/Hz8+PO++806n7FJGbU1Ekcgto2bIlO3fuZOXKlURHR+da/5///AdPT0+aNGnCr7/+WvwBAjNnzmTChAnUqlXL6fsKDw8nNjbW+t4wDKZPn87UqVN57rnneOCBBwgODnba/pcvXw7Ahg0buP322522HxGxj06fidwCYmJi8PDwYPHixbnWXbhwgZUrV9KlSxdCQkJcEJ1FtWrVCA8Pp0yZMsW+b5PJxAsvvECdOnW4fPky33//vVP3d/z4cQAVRCIljIoikSJKS0tj5syZNG/enHLlyhEQEECdOnXo27cvq1evztU+PT2dmTNn0rJlSwICAggICKBdu3Z8+OGHNvs3mUzUrl2bq1evMn36dMLDw/H19bU54pOXatWqcffdd7NixQpSUlJyrPvss8/IyMjg4YcfzrePY8eO8fjjjxMWFoavry/BwcHcf//9bN26NUe7HTt2YDKZaNu2bZ59/etf/8JkMjFmzBjrsvzmFNn7mRWGh4cHzZs3Byy5wv/mIA0ePJhTp04xbNgwatasiZeXF2+99ZZ122PHjjFy5Ejq1KmDn58fFStW5O9//zubN2/OsY/sHA8fPgyQY27TkSNHCp1vQb4jhe0zMzOTV199lfr16+Pr60toaCj/+Mc/yMjIsLndpUuXePXVV2nVqhVBQUGULVuW8PBwRowYwR9//JGr/c8//0zfvn2pVq0aPj4+1KxZk2HDhpGUlGSzfxFn0ukzkSLIzMzknnvu4eeff6Zy5cp06tQJPz8/jh8/zsqVKylbtizdunWztj9z5gxRUVH89ttvhISE0LFjRwzDYPPmzQwePJht27bxr3/9K9d+srKyiI6OZv369XTs2JFmzZpRqVIlu2IdMGAAa9as4YsvvmDIkCHW5YsXL6ZMmTLcd999NkeSAHbt2sXdd9/N2bNnadCgAffffz9JSUksW7aMb775hri4OPr27QtAREQE4eHh/PLLLxw6dIg6derk6i97PzcrxKDwn1lhXLx4EQBfX98cy//73//SunVrrl27xp133smVK1esI1pbtmyhV69enD9/ngYNGtCrVy/++9//snr1ar777jsWL15Mv379AKzzhj7//HMuXbrEoEGDrPsICAgoUr75fUeK8hn279+flStX0qlTJxo0aMCGDRt47bXXOHHiBP/5z39ytE1OTiYqKoo9e/ZQoUIFOnXqhK+vL3/++Sfvvfce9erVo379+tb2//73v3n66acBaN26NXfddRf79+9n4cKFfP3116xbt46GDRsW8OiJOIAhcos7fPiwARg3+zkMGjTIAIwpU6ZYl/3www8GYLRu3dq4fPlyjvYpKSnGtm3bcizr2bOnARijRo0yrly5Yl1+6tQpo1WrVgZgrFq1Ksc22bHVrVvXOH78uF25Zcf88ccfG6mpqYa/v7/RuXNn6/qjR48aJpPJiImJMQzDMLp162YAxo8//mhtk5WVZTRt2tQAjPHjxxtZWVnWdZ9//rnh4eFhBAQEGCdPnrQunzFjhgEY06dPzxXTwYMHDcAIDw+3Gev1+zaMwn1mefnxxx8NwOjYsWOudadPnzaCgoIMwIiPj8/RHjDuu+8+m8e4WrVqhqenp/Gf//wnx7qtW7caFSpUMAICAowzZ87kWBcWFpbn980Z35Gi9NmwYUMjOTnZuvzPP/80ypcvbwDGwYMHc2zTpUsXAzAeeugh4+LFiznWHT582Pj111+t77ds2WJ4enoaNWrUyPU7WbBggQEYbdu2tfkZiTiLiiK55RWlKPr0008NwBg9evRN97Nz505rAZWZmZlr/Y4dOwzA6N27d47l2bEtXbq0YAnZiPnjjz82DMMwHnroIcPDw8P6F+fLL79sAMa3335rGIbtoii78KtVq5Zx9erVXPu4//77DcB48cUXrcv+/PNPm4WPYRjGtGnTDMCYMWOGzViv33dhP7O82CqKLl++bPz0009G27ZtDcBo0KCBce3atRztfX19bRYbs2fPNgDjueees7m/N9980wCMN998M8fyvIoiZ3xHitpndoF4vZEjRxqAsWjRIuuyn3/+2QCM4OBgIzU1Ndc2N+rTp48BGN98843N9b179zYAY8eOHTftS8RRNKdIpAhatGiBh4cHixYtYv78+Zw7dy7PttmTd6Ojo/HwyP3Ty57r8csvv+RaZzKZuPfee4sc78MPP0xWVhZxcXGA5TRWcHAwXbt2zXObDRs2APDQQw/h7e2da/0jjzySox3AbbfdRvv27fn999/ZsWNHjvbZp84GDBhw03iL8pnlZ926dda5PP7+/rRr146ff/6ZunXrsnz5cjw9PXO0j4iIoEaNGnnGd//999vcz1133QVQ4Pic8R0pSp/e3t507tw51/LsU2DJycnWZWvWrAEsk/oDAwNt5pctKyuLtWvXUqZMmRynl69n72cn4ggqiuSWd7ObNmYzDCNX+/r16/Paa6+Rnp7OY489RnBwMM2bN2fMmDH89ttvObbPnkj7z3/+M9cNBLNfaWlpnD17Nte+g4ODc81zKYzu3btTqVIlFi9ezM6dO9mzZw/9+vXDyyvv6YUnT54EoHbt2jbXZy8/ceJEjuXZRc/185S2bdvGH3/8Qfv27bnttttuGm9RPrP8VK1alUGDBjFo0CCGDh3K+PHj+fLLL9m7dy/h4eG52ud1m4Ds+Dp06GAzttatWwMUOD5nfEeK0mdISEiuAhGwFj3XT7bOnpxuaw7Zjc6ePUtaWhrp6enWm1fe+Bo3bpy1rUhx0URrueVdfwl4enp6npeEp6enA1C2bNkcy5977jkeeughli9fTnx8PBs2bGD27Nm89dZbzJ49m1GjRgGWfx2DZbJtQf7iuJ6fn59d7fPi7e3NQw89xNy5c3n++eeBgk12zk9eRWW/fv0YPXo0S5YsYdasWTluCVCQUSIo2meWnxvvU3QzeX3+2fE9+OCDub4XN+6vIJzxHSlKn7ZGlhwhO6aAgAAeeOCBfNs2btzYKTGI2KKiSG55FStWxN/fn8uXL/Pnn3/SpEkTm+3+/PNPAGrWrJlrXWhoKE8//TRPP/00165dY8mSJTz66KOMHz+egQMHUqFCBet20dHRPPfcc85L6CYefvhh5s6dy3fffUf9+vVp06ZNvu2rV68OwNGjR22uzx6JuPH0UqVKlejWrRsrVqwgISGBjh07smTJEry9va1XY91MSfnM8lKzZk3279/PhAkTuOOOOxzSHzg23+L6DENDQwE4dOjQTdtWrlwZPz8/66nngo7WijibTp/JLc/T05MOHToAlsdd2HLs2DESExPx8PCwts2Ll5cXDz/8MK1bt+bq1ascOHAAgKioKACWLVvmwOjt1759e5o3b06lSpVyXJqfl+y5HUuXLiUzMzPX+uzLsrPbXS97RCguLo4ffviBU6dO0a1btwLfTqCkfGZ5cXR8zsi3uD7De+65B4BPPvmEtLS0fNt6eXnRqVMnUlNTWbt2rVPjErGHiiIRsJ7ieuWVV/j5559zrEtJSWHIkCFkZWVx//33W/9FDPDjjz+yZs0a6+mAbIcPH2bfvn2YTCbrv9Tbtm1LVFQUmzZtYsSIEaSmpuaK49dff+W7775zdHq5JCYmcvbsWf7xj3/ctG2nTp1o2rQpR44cYfLkyda5VWD5i/bLL78kICDAZoHVp08fAgMD+eKLL/jggw+Agp86g5L1mdny+OOPExwczGuvvcb777+f63tw7do1Vq9eze7duwvUnzPyLa7PsE2bNnTu3JkzZ87w2GOPcenSpRzrjxw5wq5du6zv//nPf+Lh4cGjjz5q84adaWlpfPDBB1y+fLlIcYnYxdWXv4mUFOPHjzcAw8PDw4iMjDT69+9v9OrVyyhXrpwBGE2aNMl1v5nsS7KrVKlidO/e3RgwYIDRtWtXw9fX1wCMp59+Okf706dPGy1btjQAo3z58kanTp2s+wkNDbXeS+Z6gBEWFlaonG68JP9mbF2SbxiG8dtvvxmVKlWy3rcmJibG6NChgwEYXl5exqeffppnnwMHDrRe3h0YGGikp6fnG+uN+y7MZ5aX/O5TlF/7QYMG5dlmy5YtRuXKlQ3ACA0NNXr06GH079/fuPvuu63381m2bFmObfK7T5EzviOO7nPRokW5bk9hGIZx/Phxo0GDBgZgVKxY0ejdu7fRt29fIyIiwvDw8DBmz56do/3cuXMNT09P6+/r/vvvN/r162e0bdvW+hs6f/58nnmJOJqKIpHrrFq1yujTp48REhJieHl5GUFBQUabNm2MV1991UhLS8vV/sCBA8akSZOMDh06GNWqVTN8fHyMGjVqGF26dDG++OKLHDc6zHb58mXj7bffNtq3b2+UK1fO8PHxMUJDQ42OHTsas2bNMo4dO5ajfUkoigzDcqPH4cOHG6GhoYa3t7dRuXJlIzo62vj555/z7XP16tXWomjgwIE3jdXWvu39zPLijKLIMAwjOTnZGD9+vNG4cWOjTJkyRpkyZYw6deoYffr0MWJjY3PdyDC/osgwnPMdcWSfeRVFhmEYqampxvTp041mzZoZ/v7+RkBAgBEeHm6MHDnSOHDgQK72O3fuNAYNGmSEhYUZPj4+Rvny5Y3GjRsbQ4YMMVasWGHzNyTiLCbDuG4sXEREROQWpTlFIiIiIqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIpE8HThwAA8PDzZu3Fis+01LS8PLy4uPPvqoWPcrInKru+Uuyc/KyuLkyZMEBgbqeTuSr7/97W9cunSJ7du3A/Dll1/ywgsvkJycTGZmJj4+PnTt2jXHU+ALomfPnmzatCnHMm9v7xxPAx80aBAJCQl5Pm9MRORWYxgGFy9epHr16k57WPEtVxQdP348x2MaREREpPQ4duyYzQdzO4KXU3otwQIDAwHLhxoUFOTQvs1mM99//z1du3bF29vboX2XBO6eH/wvx40bNzJ37lwuXLiQb/t27dpx8uRJkpKSCryPnj17sn37dk6fPp1vu1q1atGoUSOHPtfL3Y+hu+cH7p+j8iv9nJVjamoqoaGh1r/HneGWK4qyT5kFBQU5pSgqU6YMQUFBbvlld/f84H85bty4kUqVKt30O3L58mUCAgLs+i55eXlx5coVKlSogIeHBzVq1OCTTz4hMjIyR7vw8HD27t3r0O+pux9Dd88P3D9H5Vf6OTtHZ0590URrERtOnz5NhQoV8m0zb948jhw5wogRI+zq++677+bZZ5/l008/ZerUqZw7d4677rqLkydP5mhXo0aNXE8aFxER57nlRopECuLatWv4+vrmuX7ZsmU8+eSTdOnShYkTJ9rV9+TJk3O8f/jhh6lduzbPP/88sbGx1uVly5YlMzPTrr5FRKTwNFIkYkNAQAAXL160ue7rr7/mgQceIDIykjVr1hR5X2FhYZQpU4b9+/fnWP7f//4XHx+fIvcvIiIFo6JIxIbGjRvbnAj91VdfER0dTatWrXJdVl9Yp06d4vLly1SvXj3H8v379+daJiIizqOiSMSGgQMHcuXKFQ4fPmxdtmzZMu677z5q167NggUL+O233/jtt9/Yt2+fXX23atWKOXPmsHHjRubNm0fjxo0BePHFF3O0S0pKomvXrkVPRkRECkRFkYgN999/P2XLlmXSpEnWZXPmzMEwDA4fPkzz5s2tr6ZNm1rbbNy4EZPJxFtvvZVn32fOnGHMmDHcddddPPXUU5QtW5Y1a9bQsGFDa5v333+frKwsXn75ZafkJyIiuakoEsnD2LFj+fzzz7l27RoACQkJGIaR65W9HuCXX37BZDLRp0+fPPtNSkoiMzMTwzDIzMwkKSmJu+++O0ebF198kXvuuYeKFSs6JzkREclFRZFIHqZOnWq90WJBffLJJ/To0YPbbrut0PtNS0ujfv36LFmypNB9iIiI/XRJvkg+li1bZlf7rVu3FnmfAQEBDrmqTURE7KORIrnlXTlzjm0PjmBl2SasrnQHANseGEH64WMujkxERIqTS4uiqVOnYjKZcrzCw8Pz3Wbp0qWEh4fj5+dH06ZNWblyZTFFK+4o/fAxfry9E6e/WoNx1Wxdfi7hJ35s2JXzP//qwuhERKQ4uXykqHHjxiQnJ1tfGzduzLPt5s2biYmJYejQoezcuZPo6Giio6PZvXt3MUYs7mTLPQPJyrhqe2VmFr/0Glq8AYmIiMu4vCjy8vIiJCTE+qpcuXKebefMmUP37t0ZN24cDRs2ZMaMGURERPDOO+8UY8TiLlJ3/8GVpOueN2YYBF9LBcOwLrqWcpFTX2l+j4jIrcDlE60PHDhA9erV8fPzIzIykpkzZ1KrVi2bbbds2cKYMWNyLOvWrRvLly/Ps/+MjAwyMjKs71NTUwHLU3zNZnNemxVKdn+O7rekcLf8Tnwdj+H/v+eb3Xb1LI0vJ3Ni1ix+8/EkE8u6k9/+QKWeHV0VpkO52zG8kbvnB+6fo/Ir/ZyVY3F8ZibDuO6fxcVs1apVpKWl0aBBA5KTk5k2bRonTpxg9+7dBAYG5mrv4+PDhx9+SExMjHXZv//9b6ZNm2bzkQxgmbc0bdq0XMvj4uIoU6aM45KRUu+2FStoEhuLx7VrXKpalW3jxnGhbl1XhyUiIkB6ejr9+/cnJSWFoKAgp+zDpUXRjS5cuEBYWBhvvvkmQ4fmnstRmKLI1khRaGgoZ8+edfiHajabiY+PJyoqCm9vb4f2XRK4W35XTp5mXdOeOZaV8zQT4fMXZc+cIQsT+3xDCF77NeXbNHdRlI7lbsfwRu6eH7h/jsqv9HNWjqmpqVSuXNmpRZHLT59dr3z58tSvX5+DBw/aXB8SEpKr+Dl9+jQhISF59unr64uvr2+u5d7e3k77Qjqz75LAXfLzDqtJufA6pO7ca12W4u9LwptvEjH4KapdS6VxRjLMehE++ADc6O7S7nIM8+Lu+YH756j8Sj9H51gcn5fLJ1pfLy0tjUOHDlGtWjWb6yMjI1m7dm2OZfHx8URGRhZHeOKGIn/4Dz5VK+VYdi0ggO1+tdjrXxPDxwe++gpatoSffnJRlCIiUhxcWhSNHTuWdevWceTIETZv3sx9992Hp6en9fTYwIEDmThxorX9qFGj+O6773jjjTf4/fffmTp1Ktu2bWPkyJGuSkFKOa+AsnQ5sp7600fjVzMEjzL+ANQe9Sj1/zqAacsWqFMHkpLgrrvg9dchK8vFUYuIiDO4tCg6fvw4MTExNGjQgIceeohKlSrx008/UaVKFcDy4Mzk5GRr+/bt2xMXF8f7779P8+bN+fzzz1m+fDlNmjRxVQriBjy8vKg38Um6HF5H1DHLfbIaTHkaLz8/iIiAHTugXz+4dg3GjYPeveHsWRdHLSIijubSOUU3e+BlQkJCrmV9+/alb9++TopIxIagIPjkE+jcGUaNgm+/tZxO++QTuPNOV0cnIiIOUqLmFImUWCYTPP44/Pwz1K8Px49Dp04wc6ZOp4mIuAkVRSL2aN4ctm+Hhx+GzEx4/nno0QPOnHF1ZCIiUkQqikTsFRAAH30ECxeCvz98/z20aAE2TveKiEjpoaJIpDBMJhgyBLZuhUaNIDkZunSB6dMtI0giIlLqqCgSKYrGjeGXX+DRRy1zi6ZMga5d4dQpV0cmIiJ2UlEkUlRly1rueP3RR5Y///CD5XTamjWujkxEROygokjEUR55BLZtg6ZN4fRpy4jRCy9Y7m8kIiIlnooiEUcKD7dctv/YY2AY8OKLlrlGJ064OjIREbkJFUUijubvD/PmWW7uGBAA69dbTqd9952rIxMRkXyoKBJxlv/7P8sjQlq2tDwWpEcPmDABzGZXRyYiIjaoKBJxpnr1YPNmGDHC8v7VVy13wj52zKVhiYhIbiqKRJzNzw/eeQeWLrU8R23zZsvptG++cXVkIiJyHRVFIsXlwQdh505o1Qr++gt694bnnoOrV10dmYiIoKJIpHjdfjts2gSjR1vev/km3HUXHDniyqhERAQVRSLFz8cHZs+G5cuhfHnLHbFbtoRly1wdmYjILU1FkYir9OkDiYnQrh1cuAD33w/PPAMZGa6OTETklqSiSMSVwsIs9zEaN87y/l//gg4d4NAh18YlInILUlEk4mre3vDaa7BiBVSqBNu3W06nffaZqyMTEbmlqCgSKSl69bKcTrvzTrh4Efr1gyefhCtXXB2ZiMgtQUWRSElSsyb8+CM8/zyYTPDee5Y5R3/84erIRETcnooikZLGywteesnyrLQqVeDXXyEiAhYvdnVkIiJuTUWRSEnVtavldFqnTnDpEjz8MAwbBunpro5MRMQtqSgSKcmqV4c1a2DKFMvptIULoW1b2LfP1ZGJiLgdFUUiJZ2nJ0ydaimOQkJg927Lo0I+/NDVkYmIuBUVRSKlxd13W06n3XOP5RTa4MEwaJDl1JqIiBSZiiKR0qRqVVi9Gl58ETw84KOPLKNGu3a5OjIRkVJPRZFIaePhAf/8p+XS/erV4fffoU0bWLAADMPV0YmIlFoqikRKq7/9zXI6rXt3yw0ehw+3XKF28aKrIxMRKZVUFImUZlWqwLffwquvWiZkx8XBHXdYiiUREbGLiiKR0s7DA8aPtzxYNjQUDhyw3AV77lydThMRsYOKIhF30b497NwJ994LGRnw1FOW56elpLg6MhGRUqHEFEWvvPIKJpOJ0aNH59kmNjYWk8mU4+Xn51d8QYqUdJUqwVdfwZtvWh4XsnSp5REh27a5OjIRkRKvRBRFW7duZd68eTRr1uymbYOCgkhOTra+jh49WgwRipQiJhM8+yxs2gS1a8Off1pGkd5+W6fTRETy4fKiKC0tjQEDBjB//nwqVKhw0/Ymk4mQkBDrq2rVqsUQpUgp1KaN5XTa/feD2QyjRuHZty/eaWmujkxEpETycnUAI0aMoFevXtxzzz28+OKLN22flpZGWFgYWVlZRERE8PLLL9O4ceM822dkZJCRkWF9n5qaCoDZbMZsNhc9getk9+fofksKd88P3DDHsmXhk0/wmDsXj/Hj8fj6azpt2UJmzZqW0SM343bHzwZ3z1H5lX7OyrE4PjOTYbhuPH3JkiW89NJLbN26FT8/Pzp16kSLFi146623bLbfsmULBw4coFmzZqSkpPD666+zfv169uzZQ82aNW1uM3XqVKZNm5ZreVxcHGXKlHFkOiIlWrmDB2n1+usEnDpFlqcnex95hEN9+lhOt4mIlHDp6en079+flJQUgoKCnLIPlxVFx44do1WrVsTHx1vnEt2sKLqR2WymYcOGxMTEMGPGDJttbI0UhYaGcvbsWYd/qGazmfj4eKKiovD29nZo3yWBu+cH7p+j+dw5zj/4IDU2bQIgq2dPMhcutEzQdgPufvzA/XNUfqWfs3JMTU2lcuXKTi2KXHb6bPv27Zw5c4aIiAjrsszMTNavX88777xDRkYGnp6e+fbh7e1Ny5YtOXjwYJ5tfH198fX1tbmts76Qzuy7JHD3/MCNc6xUiW1jxxLSvz+eY8bgsXIlHq1bw5Il0KGDq6NzGLc9ftdx9xyVX+nn6ByL4/Ny2UTrLl26sGvXLhITE62vVq1aMWDAABITE29aEIGliNq1axfVqlUrhohF3ITJRNbw4fDzz1C/Phw/Dh07wiuvQFaWq6MTEXEZl40UBQYG0qRJkxzLypYtS6VKlazLBw4cSI0aNZg5cyYA06dPp127dtStW5cLFy4wa9Ysjh49yrBhw4o9fpFSr3lzy/2LnnwSFi+GiRMhIQE++giCg10dnYhIsXP5Jfn5SUpKIjk52fr+/PnzDB8+nIYNG9KzZ09SU1PZvHkzjRo1cmGUIqVYYCB8/DEsXAj+/rB6NbRoAevWuToyEZFi5/JL8q+XkJCQ7/vZs2cze/bs4gtI5FZgMsGQIdC2LfTtC/v2wd13w9Sp8PzzlgfNiojcAkr0SJGIFKPGjWHrVnj0UcvcosmToVs3OHXK1ZGJiBQLFUUi8j9ly8IHH1jmFZUpA2vXWk6nrV3r6shERJxORZGI5PbII7B9OzRtCqdPQ1SUZeQoM9PVkYmIOI2KIhGxLTzcctn+8OGWB8nOmAFdusDJk66OTETEKVQUiUje/P3h/fchLg4CAixXpTVvbrlKTUTEzagoEpGbi4mBHTss84vOnoXu3S33Nbp2zdWRiYg4jIoiESmYevVgyxZ46inL+1degU6d4Ngxl4YlIuIoKopEpOD8/ODdd2HpUggKgk2bLKNHK1a4OjIRkSJTUSQi9nvwQdi5E1q1gr/+gnvvhbFj4epVV0cmIlJoKopEpHBuvx02boTRoy3v33gD/vY3OHLElVGJiBSaiiIRKTxfX5g9G5Yvh/LlLZfwt2xpeS8iUsqoKBKRouvTBxIToV07uHAB7rsPRo2CjAxXRyYiUmAqikTEMcLCYP16y9wigLffhg4d4NAh18YlIlJAKopExHG8vWHWLMvVaJUqWR4VEhFhuVpNRKSEU1EkIo7Xq5fldNqdd0JqKjz0kOX+RleuuDoyEZE8qSgSEeeoWRN+/NFy52uAuXMhMhIOHHBtXCIieVBR5CTnzp0jODiYIy64PLldu3Z88cUXxb5fkVy8vODll+G776BKFcvoUUQEfPKJ03ftqt/g1atXqV27Ntu2bSvW/YpI0akocpKXXnqJPn36ULt2beuyZ555hjvuuANfX19atGhR5H0sWbIEk8lEdHR0juWTJk1iwoQJZGVlFXkfIg7RrZulIOrUCdLSoH9/GD4c0tOdtssbf4Pnzp2je/fuVK9eHV9fX0JDQxk5ciSpqamF3scrr7yCyWRidPa9mgAfHx/Gjh3LP/7xjyJmICLFTUWRE6Snp7Nw4UKGDh2aa92QIUPo169fkfdx5MgRxo4dy1133ZVrXY8ePbh48SKrVq0q8n5EHKZ6dVizBiZPBpMJFiyAtm1h3z6H78rWb9DDw4M+ffrw9ddf88cffxAbG8uaNWt44oknCrWPrVu3Mm/ePJo1a5Zr3YABA9i4cSN79uwpdA4iUvxUFDnBqlWr8PX1pV27djmWv/3224wYMYLbb7+9SP1nZmYyYMAApk2bZrMvT09PevbsyZIlS4q0HxGH8/SEadMsxVHVqrB7t+VRIR9+6NDd2PoNVqhQgSeffJJWrVoRFhZGly5deOqpp9iwYYPd/aelpTFgwADmz59PhQoVcq2vUKECHTp00G9QpJRRUeQEmzZt4o477nBa/9OnTyc4ONjmSFS2Nm3aFOp/9iLF4u674ddf4Z57LKfQBg+2vC5dckj3BfkNnjx5ki+//JKOHTva3f+IESPo1asX99xzT55t9BsUKX1UFDnB0aNHqV69ulP63rhxIwsXLmT+/Pn5tqtevTrHjh3TvCIpuapWtUzAnjEDPDwso0WtW1tGj4oov99gTEwMZcqUoUaNGgQFBbFgwQK7+l6yZAk7duxg5syZ+barXr06R48etatvEXEtFUVOcOXKFfz8/Bze78WLF3nkkUeYP38+lStXzretv78/WVlZZOgxC1KSeXrCpEnwww+WOUf79lkKo4ULwTAK3W1+v8HZs2ezY8cOvvrqKw4dOsSYMWMK3O+xY8cYNWoUixcvvulv3N/fn3QnTiQXEcfzcnUA7qhSpUqcP3/e4f0eOnSII0eOcO+991qXZY8EeXl5sX//furUqQPAX3/9RdmyZfH393d4HCIO17Gj5eq0gQMto0fDhlnucTR3LgQG2t1dfr/BkJAQQkJCCA8Pp2LFitx111288MILVKtW7ab9bt++nTNnzhAREWFdlpmZyfr163nnnXfIyMjA09MTsPwGq1SpYnfsIuI6GilyghYtWrB3716H9xseHs6uXbtITEy0vnr37k3nzp1JTEwkNDTU2nb37t20bNnS4TGIOE2VKvDtt/DKK5YRpMWLLZOwf/3V7q4K+hvM/kdFQUdUu3Tpkus32KpVKwYMGEBiYqK1IAL9BkVKI40UOUFUVBSTJk3i/PnzOa5MOXjwIGlpaZw6dYrLly+TmJgIQKNGjfDx8blpv35+fjRp0iTHsvLlywPkWr5hwwa6du1atEREipuHB/zjH3DXXfB//wd//GG5bP+tt+Dxxy2X8heArd/gypUrOX36NK1btyYgIIA9e/Ywbtw4OnTokON+YvkJDAzM9VsrW7YslSpVsvkbnDFjRoH6FZGSQSNFTtC0aVMiIiL47LPPciwfNmwYLVu2ZN68efzxxx+0bNmSli1bcvLkSWsbk8lEbGxskfZ/4sQJNm/ezKOPPlqkfkRcpn172LkT7r0XMjLgySctRVJKSoE2t/Ub9Pf3Z/78+dx55500bNiQZ599lt69e7NixQprmyNHjmAymUhISChS+Fu2bCElJYUHH3ywSP2ISPHSSJGTTJ48mXHjxjF8+HA8PCy1583+R3v48GG8vLzo0KFDgfdjq4B6++23GTx4MDVr1rQnZJGSpVIl+OormD3bMnr02WewfTt8+ikU4JYXN/4GO3fuzObNm/Pd5vDhw5QvX57mzZsXOExbv+u33nqLcePGaU6fSCmjkSIn6dWrF4899hgnTpwo8DYrV67kscceo169ekXad3BwsIbtxT2YTDBmDGzcCGFhcOiQZRTpX/+66dVphf0NPv/88zZvyFhQV69epWnTpjz77LOF7kNEXEMjRU50/fOQCmLEiBEO2e9zzz3nkH5ESoy2bS2n04YOhWXL4Jln4N//hvvuszxwNg/W3+CMGZCZCVOn5rubWbNmFTlUHx8fJk2aVOR+RKT4aaSoiAzD4NTyeH6KGsja2yx3xt373Muk/X7IxZGJuJkKFeCLLyyjRD4+8PvvMHMmPPZY/tvNmGF53tp1V4aJiNhSYooiW0+btmXp0qWEh4fj5+dH06ZNWblyZfEEaINhGOx6cjLb+47k3IZtXEtNA+D4f5az/o4+nFm93mWxibglkwlGjoTNm+H/35OL+fOhe3fbp9OyC6Lp0+GFF4o3VhEpdUpEUZTf06avt3nzZmJiYhg6dCg7d+4kOjqa6OhodjvgsQCFceI/X3Fs4f+/uiUz07rcuJaJYb7G9r5PYz5fsKtlRMQOd9xhmXT90EOW96tXQ3g4nDv3vzYqiETETi4vim72tOnrzZkzh+7duzNu3DgaNmzIjBkziIiI4J133immaHM6PCfWcl8VWwyDrCsZHP9oWbHGJHLLKFcOliyx3PXaywv++AOvBg2o8PvveLz0kgoiEbGbyydaX/+06RdffDHftlu2bMn1nKJu3bqxfPnyPLfJyMjIcbfa1NRUAMxmM2azudBxZ127Rsoff4Kvt3WZ4eeb4794eHBu+y5qFmE/JUn251WUz62kc/cc3TK/oUOhVSu8unfHdO4cd02YgAnInDKFrAkTwJ1yxU2P4XWUX+nnrByL4zNzaVGU/bTprVu3Fqj9qVOnqFq1ao5lVatW5dSpU3luM3PmTKZNm5Zr+ffff0+ZMmXsC/hGH9u+7D1r/v+uPDkBnHDhvCdniI+Pd3UITufuObpjfl7vvEOP/v3xMAwyPT1Z0bIluNlv73rueAyvp/xKP0fnWBwPWHZZUZT9tOn4+HinPFE+28SJE3OMLqWmphIaGkrXrl0JCgoqUt9b+zzOX1t2QKbl+UmGny9Z8yfhMfxFTFcso1NN/jWVGv3vza+bUsNsNhMfH09UVBTe3t4336AUcvcc3Tk/j5deshZEnpmZ/H3nTrL++U9Xh+Vw7nwMQfm5A2flmH2mx5lcVhTZ87TpbCEhIZw+fTrHstOnTxMSEpLnfnx9ffH19c213Nvbu8gHq+6owWyN35RruelKBqar1/CpXIHQh3ri6WZffEd8diWdu+fodvnNmAHTppE5ZQorWrbk7zt34jltmuX/IW46p8jtjuENlF/p5+gci+PzctlEa3ueNp0tMjKStWvX5lgWHx9PZGRkcYWdQ3C3v9HwtQkAmLyui9dkwqdCEG2/XYinv/NGwUSEHFeZZY8MZf3zn5ZJ1pMnW9aLiBSAy0aKCvK06YEDB1KjRg1mzpwJwKhRo+jYsSNvvPEGvXr1YsmSJWzbto3333+/2OPPdvuzj1Kl650cfX8J53f9zl9A+EvPEfZwNN7li3Z6TkRu4sbL7q+fiJk9QjR5cs73IiJ5cPnVZ/lJSkqyPkwVoH379sTFxTFp0iSef/556tWrx/Lly3MVV8UtsHE9msx5AbPZzMqVKwl7PMbth0VFXK4g9yFSYSQidihRRdGNT5u29fTpvn370rdv3+IJSERKrszMgt2HKHv9dTdYFRGxpUQVRSIiBXaTh7vmoBEiESkAl9/RWkRERKQkUFEkIiIigooiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAgAXvZuMGbMGJvLTSYTfn5+1K1blz59+lCxYsUiByciIiJSXOwuinbu3MmOHTvIzMykQYMGAPzxxx94enoSHh7Ov//9b5577jk2btxIo0aNHB6wiIiIiDPYffqsT58+3HPPPZw8eZLt27ezfft2jh8/TlRUFDExMZw4cYK//e1vPPvsszfta+7cuTRr1oygoCCCgoKIjIxk1apVebaPjY3FZDLlePn5+dmbgoiIiEgudo8UzZo1i/j4eIKCgqzLypUrx9SpU+natSujRo1i8uTJdO3a9aZ91axZk1deeYV69ephGAYffvghffr0YefOnTRu3NjmNkFBQezfv9/63mQy2ZuCiIiISC52F0UpKSmcOXMm16mx//73v6SmpgJQvnx5rl69etO+7r333hzvX3rpJebOnctPP/2UZ1FkMpkICQmxN2wRERGRfNldFPXp04chQ4bwxhtv0Lp1awC2bt3K2LFjiY6OBuCXX36hfv36dvWbmZnJ0qVLuXTpEpGRkXm2S0tLIywsjKysLCIiInj55ZfzLKAAMjIyyMjIsL7PLtzMZjNms9muGG8muz9H91tSuHt+4P45Kr/Sz91zVH6ln7NyLI7PzGQYhmHPBmlpaTz77LN89NFHXLt2DQAvLy8GDRrE7NmzKVu2LImJiQC0aNHipv3t2rWLyMhIrly5QkBAAHFxcfTs2dNm2y1btnDgwAGaNWtGSkoKr7/+OuvXr2fPnj3UrFnT5jZTp05l2rRpuZbHxcVRpkyZgiUtIiIiLpWenk7//v1JSUnJMYXHkewuirKlpaXx559/AnD77bcTEBBQqACuXr1KUlISKSkpfP755yxYsIB169YV6Mo1s9lMw4YNiYmJYcaMGTbb2BopCg0N5ezZsw7/UM1mM/Hx8URFReHt7e3QvksCd88P3D9H5Vf6uXuOyq/0c1aOqampVK5c2alFkd2nz7IFBATQrFmzIgfg4+ND3bp1AbjjjjvYunUrc+bMYd68eTfd1tvbm5YtW3Lw4ME82/j6+uLr62tzW2d9IZ3Zd0ng7vmB++eo/Eo/d89R+ZV+js6xOD4vu4uiS5cu8corr7B27VrOnDlDVlZWjvXZo0eFlZWVlWNkJz+ZmZns2rUrz9NtIiIiIgVld1E0bNgw1q1bxyOPPEK1atWKdEn8xIkT6dGjB7Vq1eLixYvExcWRkJDA6tWrARg4cCA1atRg5syZAEyfPp127dpRt25dLly4wKxZszh69CjDhg0rdAwiIiIiUIiiaNWqVXz77bd06NChyDs/c+YMAwcOJDk5mXLlytGsWTNWr15NVFQUAElJSXh4/O/+kufPn2f48OGcOnWKChUqcMcdd7B582bdOVtERESKzO6iqEKFCg57rtnChQvzXZ+QkJDj/ezZs5k9e7ZD9i0iIiJyPbsf8zFjxgwmT55Menq6M+IRERERcQm7R4reeOMNDh06RNWqValdu3au2eA7duxwWHAiIiIixcXuoij7rtUiIiIi7sTuomjKlCnOiENERETEpeyeUyQiIiLijgo0UlSxYkX++OMPKleuTIUKFfK9N9Fff/3lsOBEREREikuBiqLZs2cTGBho/XNRbtgoIiIiUhIVqCgaNGiQ9c+DBw92ViwiIiIiLmP3nCJPT0/OnDmTa/m5c+fw9PR0SFAiIiIixc3uosgwDJvLMzIy8PHxKXJAIiIiIq5Q4Evy3377bQBMJhMLFiwgICDAui4zM5P169cTHh7u+AhFREREikGBi6LsZ44ZhsF7772X41SZj48PtWvX5r333nN8hCIiIiLFoMBF0eHDhwHo3LkzX375JRUqVHBaUCIiIiLFze47Wv/444/OiENERETEpewuigCOHz/O119/TVJSElevXs2x7s0333RIYCIiIiLFye6iaO3atfTu3Zvbb7+d33//nSZNmnDkyBEMwyAiIsIZMYqIiIg4nd2X5E+cOJGxY8eya9cu/Pz8+OKLLzh27BgdO3akb9++zohRRERExOnsLor27dvHwIEDAfDy8uLy5csEBAQwffp0Xn31VYcHKCIiIlIc7C6KypYta51HVK1aNQ4dOmRdd/bsWcdFJiIiIlKM7J5T1K5dOzZu3EjDhg3p2bMnzz33HLt27eLLL7+kXbt2zohRRERExOnsLorefPNN0tLSAJg2bRppaWl8+umn1KtXT1eeiYiISKllV1GUmZnJ8ePHadasGWA5laa7WIuIiIg7sGtOkaenJ127duX8+fPOikdERETEJeyeaN2kSRP+/PNPZ8QiIiIi4jJ2F0UvvvgiY8eOZcWKFSQnJ5OamprjJSIiIlIa2T3RumfPngD07t0bk8lkXW4YBiaTiczMTMdFJyIiIlJM9EBYEREREQpRFHXs2NEZcYiIiIi4lN1zikRERETckYoiEREREVQUiYiIiAAuLormzp1Ls2bNCAoKIigoiMjISFatWpXvNkuXLiU8PBw/Pz+aNm3KypUriylaERERcWdFLoquXr1qfRaavWrWrMkrr7zC9u3b2bZtG3fffTd9+vRhz549Nttv3ryZmJgYhg4dys6dO4mOjiY6Oprdu3cXJQURERER+4qiRYsW8fTTT7N48WIAJk6cSGBgIOXKlSMqKopz587ZtfN7772Xnj17Uq9ePerXr89LL71EQEAAP/30k832c+bMoXv37owbN46GDRsyY8YMIiIieOedd+zar4iIiMiNCnxJ/ksvvcRLL71Ehw4diIuLY+PGjSxfvpzp06fj4eHB22+/zaRJk5g7d26hAsnMzGTp0qVcunSJyMhIm222bNnCmDFjcizr1q0by5cvz7PfjIwMMjIyrO+z77ptNpsxm82FijUv2f05ut+Swt3zA/fPUfmVfu6eo/Ir/ZyVY3F8ZibDMIyCNKxXrx7Tp08nJiaGbdu20bZtWz777DMeeOABAFatWsUTTzzB0aNH7Qpg165dREZGcuXKFQICAoiLi7PeNftGPj4+fPjhh8TExFiX/fvf/2batGmcPn3a5jZTp05l2rRpuZbHxcVRpkwZu2IVERER10hPT6d///6kpKQQFBTklH0UeKQoKSmJO++8E4BWrVrh5eVFkyZNrOubNWtGcnKy3QE0aNCAxMREUlJS+Pzzzxk0aBDr1q2jUaNGdvdly8SJE3OMLqWmphIaGkrXrl0d/qGazWbi4+OJiorC29vboX2XBO6eH7h/jsqv9HP3HJVf6eesHIvj+aoFLorMZjO+vr7W9z4+PjmS9fLyKtRzz3x8fKhbty4Ad9xxB1u3bmXOnDnMmzcvV9uQkJBcI0KnT58mJCQkz/59fX1zxJ3N29vbaV9IZ/ZdErh7fuD+OSq/0s/dc1R+pZ+jcyyOz8uux3zs3buXU6dOAZYHwP7+++/WK8/Onj3rkICysrJyzAG6XmRkJGvXrmX06NHWZfHx8XnOQRIREREpKLuKoi5dunD9FKS///3vAJhMJgzDwGQy2bXziRMn0qNHD2rVqsXFixeJi4sjISGB1atXAzBw4EBq1KjBzJkzARg1ahQdO3bkjTfeoFevXixZsoRt27bx/vvv27VfERERkRsVuCg6fPiww3d+5swZBg4cSHJyMuXKlaNZs2asXr2aqKgowDKPycPjf3cNaN++PXFxcUyaNInnn3+eevXqsXz58hxzm0REREQKo8BFUVhYmMN3vnDhwnzXJyQk5FrWt29f+vbt6/BYRERE5NamZ5+JiIiIoKJIREREBFBRJCIiIgKoKBIREREBClkUXbt2jTVr1jBv3jwuXrwIwMmTJ633LBIREREpbey6TxHA0aNH6d69O0lJSWRkZBAVFUVgYCCvvvoqGRkZvPfee86IU0RERMSp7B4pGjVqFK1ateL8+fP4+/tbl993332sXbvWocGJiIiIFBe7R4o2bNjA5s2b8fHxybG8du3anDhxwmGBiYiIiBQnu0eKsrKybD749fjx4wQGBjokKBEREZHiZndR1LVrV9566y3re5PJRFpaGlOmTKFnz56OjE1ERESk2Nh9+uyNN96gW7duNGrUiCtXrtC/f38OHDhA5cqV+eSTT5wRo4iIiIjT2V0U1axZk19//ZUlS5bw22+/kZaWxtChQxkwYECOidciIiIipYndRRGAl5cXDz/8sKNjEREREXGZAhVFX3/9NT169MDb25uvv/4637a9e/d2SGAiIiIixalARVF0dDSnTp0iODiY6OjoPNuZTCabV6aJiIiIlHQFKoqysrJs/llERETEXdh9Sf6xY8ecEYeIiIiIS9ldFNWuXZuOHTsyf/58zp8/74yYRERERIqd3UXRtm3baNOmDdOnT6datWpER0fz+eefk5GR4Yz4RERERIqF3UVRy5YtmTVrFklJSaxatYoqVarw2GOPUbVqVYYMGeKMGEVERESczu6iKJvJZKJz587Mnz+fNWvWcNttt/Hhhx86MjYRERGRYlPoouj48eO89tprtGjRgjZt2hAQEMC7777ryNhEREREio3dd7SeN28ecXFxbNq0ifDwcAYMGMBXX31FWFiYM+ITERERKRZ2F0UvvvgiMTExvP322zRv3twZMYmIiIgUO7uLoqSkJEwmkzNiEREREXEZu4sik8nEhQsXWLhwIfv27QOgUaNGDB06lHLlyjk8QBEREZHiUKj7FNWpU4fZs2fz119/8ddffzF79mzq1KnDjh07nBGjiIiIiNPZPVL07LPP0rt3b+bPn4+Xl2Xza9euMWzYMEaPHs369esdHqSIiIiIs9ldFG3bti1HQQTg5eXF+PHjadWqlUODExERESkudp8+CwoKIikpKdfyY8eOERgY6JCgRERERIqb3UVRv379GDp0KJ9++inHjh3j2LFjLFmyhGHDhhETE+OMGEVERESczu6i6PXXX+f+++9n4MCB1K5dm9q1azN48GAefPBBXn31Vbv6mjlzJq1btyYwMJDg4GCio6PZv39/vtvExsZiMplyvPz8/OxNQ0RERCQHu+cU+fj4MGfOHGbOnMmhQ4cAqFOnDmXKlLF75+vWrWPEiBG0bt2aa9eu8fzzz9O1a1f27t1L2bJl89wuKCgoR/Gk+yaJiIhIUdldFGUrU6YMTZs2LdLOv/vuuxzvY2NjCQ4OZvv27fztb3/LczuTyURISEiR9i0iIiJyvQIXRUOGDClQuw8++KDQwaSkpABQsWLFfNulpaURFhZGVlYWERERvPzyyzRu3Nhm24yMDDIy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6lSmTZuWa3lcXBxlypRxVPgiIiLiROnp6fTv35+UlBSCgoKcso9SVRTZ0rFjR2rVqsXHH39sc72tkaLQ0FDOnj3r8A/VbDYTHx9PVFQU3t7eDu27JHD3/MD9c1R+pZ+756j8Sj9n5ZiamkrlypWdWhSVytNn12vTpg0bN27Mc72vry++vr65lnt7ezvtC+nMvksCd88P3D9H5Vf6uXuOyq/0c3SOxfF5lfr7FCUmJlKtWjVXhyEiIiKlnEtHitLS0jh48KD1/eHDh0lMTKRixYrUqlWLiRMncuLECT766CMA3nrrLW677TYaN27MlStXWLBgAT/88APff/+9q1IQERERN+HSomjbtm107tzZ+n7MmDEADBo0iNjYWJKTk0lKSrKuv3r1Ks899xwnTpygTJkyNGvWjDVr1uToQ0RERKQwXFoUderUifzmecfGxuZ4P378eMaPH+/kqERERORWVOrnFImIiIg4gooiEREREVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIk5y7tw5goODOXLkSLHvu127dnzxxRd2baOiSERERJzipZdeok+fPtSuXdu6zGQy5XotWbLErn7Xr1/PvffeS/Xq1TGZTCxfvjxXm0mTJjFhwgSysrIK3K+KIhEREXG49PR0Fi5cyNChQ3OtW7RoEcnJydZXdHS0XX1funSJ5s2b8+677+bZpkePHly8eJFVq1YVuF8vu6IQERERKYBVq1bh6+tLu3btcq0rX748ISEhhe67R48e9OjRI982np6e9OzZkyVLltCrV68C9auRIhEREXG4TZs2cccdd9hcN2LECCpXrkybNm344IMPMAzDKTG0adOGDRs2FLi9RopERETE4Y4ePUr16tVzLZ8+fTp33303ZcqU4fvvv+epp54iLS2NZ555xuExVK9enWPHjpGVlYWHx83HgVQUiYiIiMNduXIFPz+/XMtfeOEF659btmzJpUuXmDVrllOKIn9/f7KyssjIyMDf3/+m7XX6TERERByuUqVKnD9//qbt2rZty/Hjx8nIyHB4DH/99Rdly5YtUEEEKopERETECVq0aMHevXtv2i4xMZEKFSrg6+vr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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "#TODO\n",
    "X_a = X[:, 0]\n",
    "X_b = X[:, 1]\n",
    "plt.scatter(X_a,X_b,c=y, cmap='coolwarm', marker='o', label='Existing data')\n",
    "\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "#TODO\n",
    "new_user = np.array([[3, 4]])\n",
    "plt.plot(new_user[0, 0],new_user[0, 1], 'rx', markersize=8)\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)#TODO\n",
    "nearest = X[idx[0, 0]]#TODO # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "#TODO\n",
    "\n",
    "plt.plot([new_user[0,0],nearest[0]],[new_user[0,1],nearest[1]], 'r-',label='link to nearest beighbor')\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
